#pragma once
#include<string>
#include"json/json.h"

//序列化，反序列化，编码，解码

//使用说明：
//Request:
//Request req(data1,data2,op);   req.Serialize(&str);  //序列化, 通过data1,data2,op 得到了 str
//Request req;   req.DeSerialize(str);                 //反序列化, 通过str 得到了 data1,data2,op

//Response:
//Response rsp(result,code);   rsp.Serialize(&str);  //序列化, 通过result,code 得到了 str
//Response rsp;   rsp.DeSerialize(str);      //反序列化, 通过str 得到了 result,code


const std::string protocol_sep = "\n";

//编码: 发送的报文是："内容长度" + 分隔符 + "原始内容" + 分隔符
void EnCode(const std::string& content,std::string *package)
{
    *package+=std::to_string(content.size());
    *package+=protocol_sep;
    *package+=content;
    *package+=protocol_sep;
}

//解码
bool DeCode(std::string& package,std::string *content)  //package可能会有两条内容或者半条内容
{
    //找分隔符
    auto pos=package.find(protocol_sep);
    if(pos==std::string::npos)
        return false;

    //提取内容长度
    std::string len_str =package.substr(0,pos);
    int len=std::stoi(len_str.c_str());   //内容长度

    //查看整个报文是否有一条报文的长度
    int total_len=len_str.size()+2+len;
    if(package.size()<total_len)
        return false;

    //提取len长度的内容
    *content=package.substr(pos+1,len);

    //package丢弃一条报文长度
    package.erase(0,total_len);
    return true;
}



class Request
{
    public:
        int _data1;
        int _data2;
        char _op;   //value不能有char类型,value中直接用int就行
    public:
        Request(int data1,int data2,char op):_data1(data1),_data2(data2),_op(op)
        {}

        Request(){}

        // 用root(用类成员生成) 转成str
        bool Serialize(std::string* str)
        {
            Json::Value root;
            root["data1"]=_data1;
            root["op"]=(int)_op;
            root["data2"]=_data2;

            Json::StyledWriter w;
            *str=w.write(root);
            return true;
        }

        // 已知的str 转成root(root可以完善类)
        bool DeSerialize(const std::string str)
        {
            Json::Value root;
            Json::Reader r; 
            r.parse(str,root);
            _data1=root["data1"].asInt();
            _data2=root["data2"].asInt();
            _op=root["op"].asInt();
            return true;
        }

        std::string GetRequest()
        {
            std::string quest;
            quest+=std::to_string(_data1);
            quest+=_op;
            quest+=std::to_string(_data2);
            quest+="=?";
            return quest;
        }

};



class Response
{
    public:
        int _result=0;
        int _code=0;  // 0，可信，否则!0具体是几，表明对应的错误原因
    public:
        // 用root(用类成员生成) 转成str
        bool Serialize(std::string* str)
        {
            Json::Value root;
            root["result"]=_result;
            root["code"]=_code;

            Json::StyledWriter w;
            *str=w.write(root);
            return true;
        }

        // 已知的str 转成root(root可以完善类)
        bool DeSerialize(const std::string str)
        {
            Json::Value root;
            Json::Reader r; 
            r.parse(str,root);
            _result=root["result"].asInt();
            _code=root["code"].asInt();
            return true;
        }

        std::string GetResult()
        {
            std::string ret;
            ret+="result: ";
            ret+=std::to_string(_result);
            ret+="    code: ";
            ret+=std::to_string(_code);
            return ret;
        }
};